import {number} from "echarts";

/**
 * 公共分页返回信息
 */

interface PublicPageInfo {
  extra?: object;
  total?: string | number;
}

interface PubliceSearchInfo {
  currentPage?: number | string;
  pageSize?: number | string;
}

interface PubliceSearchPage {
  total: number;
  page: number;
  pageSize: number;
}

/**
 * 添加设备
 */
export interface AddDevice {
  // 设备名称
  deviceName?: string;
  //  设备编码
  machineCode?: string;
  //  单位编码
  unitCode?: string;
}

/** ----- */
/**
 * 获取设备配置
 */

export type DeviceConfig = {
  deviceConfigParam?: TimeConfig;
  deviceSegmentVOList?: MealConfig[];
  machineCode?: string;
};

/**
 * 时长配置
 */
export interface TimeConfig {
  // 层数
  doorNum?: number | string;
  // 留样时长
  keepDurationHours?: number | string;
  // 开门等待时长
  openDoorWaitSeconds?: number | string;
}

/**
 * 餐段配置
 */
export interface MealConfig {
  // 结束时间
  gmtEnd?: string;
  // 开始时间
  gmtStart?: string;
  // 是否留样(0:否,1:是)
  isKeep: string | number;
  // 设备机器码
  machineCode?: string;
  // 餐段ID
  mealSegmentId?: string;
  // mealSegmentName
  mealSegmentName?: string;
}

/** ----- */
/**
 * 查询设备列表
 */

export interface SearchDeviceList extends PubliceSearchInfo {
  // 设备名称
  deviceName?: string;
  // 设备状态 not_active-未激活 offline-离线 online-在线
  deviceStatus?: string;
  // 设备编码
  unitCode?: string;
}

/**
 *  设备列表详情
 */
export type DeviceInfo = PublicPageInfo & {
  list?: InfoList[];
};

export interface InfoList {
  /**
   * 创建来源app-留样柜app、platform-后台
   */
  createdSource?: string;
  /**
   *  设备名称
   */
  deviceName?: string;
  /**
   * 设备状态 not_active-未激活 offline-离线 online-在线
   */
  deviceStatus?: string;
  id?: string;
  /**
   * 设备ID
   */
  machineCode?: string;
  /**
   * 单位编码
   */
  unitCode?: string;
  /**
   * 所属组织
   */
  unitName?: string;
}

/**
 * 单位所有设备信息
 */

export interface AllDeviceList {
  /**
   * 设备ID
   */
  deviceId?: string;
  /**
   *  设备名称
   */
  deviceName?: string;
  id?: string;
  /**
   * 设备编号
   */
  machineCode?: string;
}

/**
 * 用户-设备绑定&解绑关系
 */

export interface UserDeviceBinding {
  /**
   * 绑定的设备ID列表
   */
  machineCodeList?: string[];
  /**
   *  用户ID
   */
  userId?: string;
}

/**
 * 用户-设备绑定关系列表
 */

export type RelationList = {
  bindingList?: AllDeviceList[];
  unbindingList?: AllDeviceList[];
};

/**
 * 留样计划-列表(分页)
 */

export type SamplePlan = PublicPageInfo & {
  list?: PlanList[];
};

interface PlanList extends AllDeviceList {
  /**
   * 留样日期
   */
  gmtCook?: string;
  /**
   * keepTime
   */
  keepTime?: string;
  /**
   * 餐段ID
   */
  mealSegmentId?: string;
  /**
   * 留样人
   */
  operator?: string;
  /**
   * 餐段名称
   */
  mealSegmentName?: string;
  /**
   * 来源:1 小程序,2 后台
   */
  source?: string;
  platformDishList?: DishList[];
}

/**
 * 菜肴列表
 */
interface DishList {
  /**
   * 菜肴简称
   */
  dishAbbreviation?: string;
  /**
   * 菜肴编号
   */
  dishCode?: string;
  /**
   * 菜肴名称
   */
  dishName?: string;
  /**
   * 菜肴分类id
   */
  dishTypeId?: string;
  /**
   * dishTypeName
   */
  dishTypeName?: string;
  /**
   * 创建时间
   */
  gmtCreate?: string;
  id?: string;
}

/**
 * 留样台账-列表(分页)
 */
export interface SearchLedgerList extends PubliceSearchInfo {
  beginTime?: string;
  deviceId?: string;
  endTime?: string;
  mealSegmentId?: string;
}

export type KeepLedger = PublicPageInfo & {
  list?: LedgerList[];
};

interface LedgerList {
  // 	留样关门拍照地址
  closeUrl?: string;
  // 	设备id
  deviceId?: string;
  // 设备名称
  deviceName?: string;
  // 留样日期
  gmtKeep?: string;
  // 取样时间
  gmtTake?: string;
  // 是否有异常 0.无， 1.有
  hasEx?: string | number;
  //
  id?: string;
  // 留样状态(0.未留样 1.已留样 2.已到期,3.已取样)
  keepStatus?: string | number;
  // 	留样日期
  keepTime?: string;
  // 设备编号
  machineCode?: string;
  // 餐段名称
  mealSegmentName?: string;
  // 留样开门拍照地址
  openUrl?: string;
  // 留样人
  operator?: string;
  // 	留样时长(H)
  sampleTime?: string;
  // 取样人
  takeOperator?: string;
  // 所属单位code
  unitCode?: string;
  // 视频地址
  videoUrl?: string;
}

/**
 * 留样台账-详情
 */
export interface LedgerDetail extends LedgerList {
  // 关门时间
  gmtCloseDoor?: string;
  // 开门时间
  gmtOpenDoor?: string;
  id?: string;
  // 本地关门拍照地址
  localCloseUrl?: string;
  // 本地开门拍照地址
  localOpenUrl?: string;
  // 本地视频地址
  localVideoUrl?: string;
  // 餐段ID
  mealSegmentId?: string;
  // 门柜编号
  num?: string | number;
  // 距离取样时间
  takeTime?: string | number;
  // 菜肴信息列表
  dishList?: DishList[];
}

/**
 * 留样计划-创建、修改留样计划
 */

export interface CreateModifyPlan {
  /**
   * 设备id
   */
  deviceId: string;
  /**
   * 用餐时间
   */
  gmtCook: string;
  id?: string;
  /**
   * 餐段
   */
  mealSegmentId: string;
  /**
   * 菜肴列表
   */
  planDishList: [
    {
      dishCode: string;
    }
  ];
}

export interface ExportResParmas {
  beginTime: string;
  endTime: string;
  mealSegmentId: string;
}

/**
 * 预警管理-预警类型列表
 */

export type WarningType = PublicPageInfo & {
  list?: TypeList[];
};

export interface TypeList {
  //预警消息
  detailMessage: string;
  // 设备ID
  deviceId: string;
  // 设备名称
  deviceName: string;
  id: string;
  // 设备机器码
  machineCode: string;
  // 餐段ID
  mealSegmentId: string;
  // 餐段名称
  mealSegmentName: string;
  // 日期
  warnDate: string;
  // 	预警详细分类
  warningDetailType: string;
  // 预警详细分类
  warningDetailTypeName: string;
  // 预警分类
  warningType: string;
  // 预警分类名称
  warningTypeName: string;
}

// unknown 是一个类型安全的any，unknown类型的变量不能直接赋值给其他变量
/**
 * 类型断言语法格式：变量 as 类型 ，<类型>变量
 * s= e as ‘type’  或者 s = <type>e
 */

/**
 * 在对象中添加任意个任意类型
 * let s:{a:string,b:number,[propName:string]:any}
 *
 * s = {a:'11;,b:11,c:true,d:[]}
 */

/**
 *class 类
 * 直接在类中定义的属性是实例属性，需要通过对象的实例去访问
 * 使用static开头的属性是静态属性（类属性），可以直接通过类访问
 */

/**
 * construct 构造函数，会在对象创建时调用，
 * 构造函数中this指向被创建的实例对象，可以通过this向新建的对象中添加属性
 */

/**
 * 以abstract声明的是抽象类，与其他的类区别不大。只是不能用来创建实例对象。抽象类是专门用来继承的类
 *  抽象类中可以定义抽象方法，抽象方法使用abstract开发，没有方法体
 *  抽象方法只能定义在抽象类中，子类必须对抽象方法进行重写
 // abstract class Person {
//   gender: string;
//
//   constructor(gender: string) {
//     this.gender = gender;
//   }
//
//   abstract speak(): void;
// }
 //
 // class Children extends Person {
//   speak() {
//     console.log("ccc");
//   }
// }
 //
 // const tom = new Children("meal");
 *
 */

/**
 * type 不可以重复定义，interface 可以重复定义，结构体包含重复定义的所有属性。
 * 接口可以在定义类的时候去限制类的结构。所有属性不能有实际的值，接口中的所有方法都是抽象方法
 */

interface myInter {
  name: string;

  seyHi(): void;
}

/**
 * 定义类时，可以通过 ‘ implements ‘ 关键字使类去实现一个接口
 * 实现接口就是让类满足接口的所有要求
 */
class MyClass implements myInter {
  name: string;

  constructor(name: string) {
    this.name = name;
  }

  seyHi() {
    console.log(44);
  }
}

/**
 * TS可以在属性钱面添加的修饰符
 * public 公共属性，可以在任意位置访问、修改
 * private 私有属性，只能在类的内部访问、修改
 * protected 受保护的属性，只能在当前类和子类中访问、修改
 */

/**
 *
 */
